#include <stdio.h>

struct ListNode {
    int val;
    struct ListNode *next;
};

// 删除链表 head 中值等于 val 的节点，并返回删除节点后的链表的头节点
struct ListNode* removeElements(struct ListNode *head, int val) {
    // 最小子问题
    if (head == NULL) return NULL;
    // 删除除了头节点的子链表中指定值的节点
    head->next = removeElements(head->next, val);
    // 处理头节点
    return head->val == val ? head->next : head;
}

// 递归
void printList(struct ListNode *head) {
    if (head == NULL) return;
    printf("%d\n", head->val);
    printList(head->next);
}

int main(void) {
    struct ListNode node2 = {3, NULL};
    struct ListNode node1 = {2, &node2};
    struct ListNode head = {1, &node1};
    printList(removeElements(&head, 2));
    return 0;
}
